#include<iostream>
#include<string>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<algorithm>
#include<functional>
#include<numeric>
#include<cmath>
using namespace std;
#define endl "\n"
#define ain(a) for(int _i=0;_i<a.size();_i++) cin >> a[_i]
#define aout(a) for(int _i=0;_i<a.size();_i++) { if(_i > 0) cout << " "; cout << a[_i]; }; cout << endl
#define couty cout << "YES\n"
#define coutn cout << "NO\n"
#define pb push_back
#define eb emplace_back
#define all(a) a.begin(),a.end()
#ifdef LOCAL_JUDGE
#include "local.hpp"
#else
template <typename Head, typename... Tail> void dout(Head&& h, Tail&&... t) {}
#endif
typedef long long ll;
typedef pair<int,int> pii; typedef pair<ll,int> pli; typedef tuple<ll,int,int> tllii;
typedef vector<int> vi; typedef vector<bool> vb; typedef vector<ll> vll; typedef vector<vector<int> > vvi; typedef vector<string> vs;
template<class T> void amin(T &a, T b) { if (a > b) a = b; }
template<class T> void amax(T &a, T b) { if (a < b) a = b; }
const ll MOD = 1e9+7;
void solve() {
int n, m , w; cin >> n >> m >> w;
vi hw(n); ain(hw);
vi hb(n); ain(hb);
vvi g(n);
for(int i=0;i<m;i++) {
int u,v;
cin >> u >> v; u--, v--;
g[u].pb(v);
g[v].pb(u);
}
// dout(g);
vi component(n,-1);
function<void(int,int)> dfs = [&](int u,int c) {
if(component[u] >= 0) return;
component[u] = c;
for(auto v:g[u]) dfs(v,c);
};
int cid=0;
for(int i=0;i<n;i++) if(component[i] < 0) {
dfs(i,cid++);
}
vector<vector<pii>> groups(cid);
for(int i=0;i<n;i++) {
int c = component[i];
groups[c].eb(hw[i],hb[i]);
}
// dout(groups);
for(auto &g:groups) {
int tw = 0, tb = 0;
for(auto [w,b]:g) {
tw += w;
tb += b;
}
g.eb(tw,tb);
}
// dout(g);
vi dp(1+w);
for(auto &g:groups) {
vi pdp = dp;
for(auto [mw,mb]:g) {
for(int tw=0;tw<=w-mw;tw++) {
dp[tw+mw] = max(dp[tw+mw],pdp[tw]+mb);
}
}
}
cout << dp[w] << endl;
}
int main(int argc,char *argv[]) {
#ifdef LOCAL_JUDGE
freopen(argc > 1 ? argv[1] : "in.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
int t = 1;
// cin >> t;
for(int i=1;i<=t;i++) {
dout("***",i);
solve();
}
}
897. Increasing Order Search Tree | 905. Sort Array By Parity |
1351. Count Negative Numbers in a Sorted Matrix | 617. Merge Two Binary Trees |
1450. Number of Students Doing Homework at a Given Time | 700. Search in a Binary Search Tree |
590. N-ary Tree Postorder Traversal | 589. N-ary Tree Preorder Traversal |
1299. Replace Elements with Greatest Element on Right Side | 1768. Merge Strings Alternately |
561. Array Partition I | 1374. Generate a String With Characters That Have Odd Counts |
1822. Sign of the Product of an Array | 1464. Maximum Product of Two Elements in an Array |
1323. Maximum 69 Number | 832. Flipping an Image |
1295. Find Numbers with Even Number of Digits | 1704. Determine if String Halves Are Alike |
1732. Find the Highest Altitude | 709. To Lower Case |
1688. Count of Matches in Tournament | 1684. Count the Number of Consistent Strings |
1588. Sum of All Odd Length Subarrays | 1662. Check If Two String Arrays are Equivalent |
1832. Check if the Sentence Is Pangram | 1678. Goal Parser Interpretation |
1389. Create Target Array in the Given Order | 1313. Decompress Run-Length Encoded List |
1281. Subtract the Product and Sum of Digits of an Integer | 1342. Number of Steps to Reduce a Number to Zero |